昨天我們實作了售票的 API ,並把購票資訊推送給 Pub/Sub 的 Topic 再由 Scbscription 推送給 Process,但 Process 並沒有將這筆資料寫入 DB 進行資料的持久化,今天就開始來時做這個部分。
先前規劃的 Schema 中並沒有購票資料相關的 Table 因此要先建立一個,寫一個新的 Model Data/Model/TIcket.cs
來讓 ORM 框架進行 Migration
using System.ComponentModel.DataAnnotations.Schema;
namespace iThome2024.ProcessService.Data.Model;
public class Ticket
{
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int Id { get; set; }
public int SeatId { get; set; }
public int UserId { get; set; }
[Column(TypeName = "timestamp")]
public DateTime CreateTime { get; set; }
public Seat Seat { get; set; }
public User User { get; set; }
}
更新 DbContext 加入對 Ticket 表的使用
public class TicketSalesContext : DbContext
{
public DbSet<User> User { get; set; }
public DbSet<Event> Event { get; set; }
public DbSet<Seat> Seat { get; set; }
public DbSet<Ticket> Ticket { get; set; }
public TicketSalesContext(DbContextOptions<TicketSalesContext> options) : base(options)
{
}
}
執行 Migration
dotnet ef migrations add CreateTableTicket
dotnet ef database update
確認一下 DB 是否確實有產出 Table
為了處理接收進來的 Message 可以從 SalesService 把 TicketViewModel Copy 一份過來,記得 namespace 要改過
namespace iThome2024.ProcessService.ViewModel;
public class TicketViewModel
{
public int EventId { get; set; }
public int SeatId { get; set; }
public string? Username { get; set; }
public DateTime CreateTime { get; set; }
}
接著更新 PubSub Push 的 Endpoint,把 Json 格式的 Message 轉換成 TickerViewModel 再寫入 DB
app.MapPost("/Test/SubEndpoint", async (PubSubMessage pubSubMessage,
[FromServices] TicketSalesContext context) =>
{
string utf8String = Base64Converter.Base64ToUtf8(pubSubMessage.Message?.Data ?? "");
var ticketViewModel = JsonSerializer.Deserialize<TicketViewModel>(utf8String);
if (ticketViewModel == null)
{
return Results.BadRequest();
}
await context.Ticket.AddAsync(new Ticket
{
SeatId = ticketViewModel.SeatId,
UserId = context.User.First().Id,
CreateTime = ticketViewModel.CreateTime
});
await context.SaveChangesAsync();
return Results.Ok();
})
接下來進行測試,我們對 Sales Service 送出一個購票的請求
確認 DB 有成功寫入
OK 這樣就完成了整個購票流程的資料串接。